package com.steptime.jdk8;


import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.RandomUtil;
import org.junit.Test;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 描述：lambda表达式使用方法
 */
public class LambdaDemo {
    /**
     * 描述：函数式接口示例
     * 利用lambda表达式快速实现函数式接口
     */
    @Test
    public void sAMTest(){
        Predicate<String> boo = s ->  "true".equals(s);
        System.out.println(boo.test("false"));
    }

    /**
     * 方法引用（Method reference）和构造器引用（construct reference）
     * 描述：若 Lambda体中的内容有方法已经实现了，我们可以使用“方法引用”或“构造器引用”
     * （可以理解为方法引用是 Lambda表达式的另外一种表现形式）
     */
    @Test
    public void refTest(){
        Consumer<String> boo = System.out::println;
        boo.accept("false");
    }

    /**
     * 四大内置核心函数式接口
     * 描述：对四大核心函数式接口进行演示
     */
    @Test
    public void intefaceTest(){
        //消费型接口：接收参数但没有返回值
        List<Integer> list = ListUtil.of(1, 2, 3, 4, 5);
        list.forEach(System.out::print);
        System.out.println();
        //供给型接口:无参数，有返回值
        Supplier<Integer> supplier = ()-> RandomUtil.randomInt(10);
        System.out.println(supplier.get());
        //函数型接口：有参数，有返回值
        System.out.println(addNum(list,(x)->x+1));
        //断定性接口：有参数，返回值为boolean
        list =ListUtil.toCopyOnWriteArrayList(list);
        list.removeIf((x) -> x%2 == 0);
        System.out.println(list);
    }

    /**
     * 对集合进行处理
     * @param list
     * @param p
     */
    public List<Integer> addNum(List<Integer> list, Function<Integer,Integer> p){
        List<Integer> intList = ListUtil.toList(list);
        for (int i = 0; i < list.size(); i++) {
            intList.set(i, p.apply(list.get(i)));
        }
        return intList;
    }

}
